//+------------------------------------------------------------------+ //| SuperStochs EA | //| version 1.0 | //| http://www.forexforums.org | //|Check EA Main thread at: | //|http://www.forexforums.org/showthread.php?t=1888 | //+------------------------------------------------------------------+ extern int Magic = 42008; // extern double LotSize = 0.1; // extern int TP = 400; // extern int SL = 1800; // extern string LongComment = "SSL"; // extern string ShortComment = "SSS"; // extern double BreakEven = 100; // Profit Lock in pips extern double BEOffset = 10; // BreakEven profit capture extern double TrailStop = 400; // extern bool MoneyManagement = true; // Set to true to use Money Management extern double MaxLotSize = 1.5; // Max Lot size when using Money Management extern double Risk = 15; // Risk factor when using MM extern int PreventPos = 1; // Prevent the opening of a new position if there are other near double S1M, S1S, S2M, S2S, S3M, S3S, S4M, S4S; string Signal; string Status; bool AccountIsMicro; double ticket, AccountSize; double slippage=5; int init() { if (MarketInfo(Symbol(),MODE_LOTSTEP) == 0.01) { AccountIsMicro = true; } else { AccountIsMicro = false; } return(0); } int start() { S1M=iStochastic(NULL,PERIOD_M5,5,3,3,MODE_SMA,0,MODE_MAIN,0); S1S=iStochastic(NULL,PERIOD_M5,5,3,3,MODE_SMA,0,MODE_SIGNAL,0); S2M=iStochastic(NULL,PERIOD_M30,5,3,3,MODE_SMA,0,MODE_MAIN,0); S2S=iStochastic(NULL,PERIOD_M30,5,3,3,MODE_SMA,0,MODE_SIGNAL,0); S3M=iStochastic(NULL,PERIOD_H1,5,3,3,MODE_SMA,0,MODE_MAIN,0); S3S=iStochastic(NULL,PERIOD_H1,5,3,3,MODE_SMA,0,MODE_SIGNAL,0); S4M=iStochastic(NULL,PERIOD_H1,14,3,3,MODE_SMA,0,MODE_MAIN,0); S4S=iStochastic(NULL,PERIOD_H1,14,3,3,MODE_SMA,0,MODE_SIGNAL,0); if (MoneyManagement) LotSize = LotSize(); if (ScanOpenTrades() == 0) Status = "READY"; Signal="NONE"; if(S1M>S1S && S2M>S2S && S3M>S3S && S4M>S4S) { Signal="LONG"; } if(S1M-1) { Status="LONG ACTIVE"; } } if(Status=="READY" && Signal=="SHORT" && !IsPosition(PreventPos)) //ScanOpenTrades() < MaxOpenTrades && { ticket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,slippage,Bid+SL*Point,Bid-TP*Point,ShortComment,Magic,0,Red); if(ticket>-1) { Status="SHORT ACTIVE"; } } if(Status=="LONG ACTIVE" && (Signal=="NONE" || Signal=="SHORT")) { if (Signal=="SHORT") OpenOrdClose(); Status="READY"; } if(Status=="SHORT ACTIVE" && (Signal=="NONE" || Signal=="LONG")) { if (Signal=="LONG") OpenOrdClose(); Status="READY"; } if (TrailStop > 0) { TrailIt(TrailStop); } if (BreakEven > 0) { DoBE(BreakEven); } return(0); } int ScanOpenTrades() { int total = OrdersTotal(); int numords = 0; for(int cnt=0; cnt<=total-1; cnt++) { OrderSelect(cnt, SELECT_BY_POS); if(OrderType()<=OP_SELL) { if(Magic > 0) if(OrderMagicNumber() == Magic) numords++; if(Magic == 0) numords++; } } return(numords); } void DoBE(int byPips) { for (int i = 0; i < OrdersTotal(); i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == Magic) ) ) { if (OrderType() == OP_BUY && (OrderStopLoss() < (OrderOpenPrice() + MarketInfo(OrderSymbol(), MODE_POINT)*BEOffset))) if ((Bid - OrderOpenPrice() > byPips * MarketInfo(OrderSymbol(), MODE_POINT)) && (OrderOpenPrice()-OrderStopLoss() > 0)) if (OrderStopLoss() != (OrderOpenPrice() + MarketInfo(OrderSymbol(), MODE_POINT))) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + MarketInfo(OrderSymbol(), MODE_POINT)*BEOffset, OrderTakeProfit(), Red); if (OrderType() == OP_SELL && (OrderStopLoss() > (OrderOpenPrice() + MarketInfo(OrderSymbol(), MODE_POINT)*BEOffset))) if ((OrderOpenPrice() - Ask > byPips * MarketInfo(OrderSymbol(), MODE_POINT)) && (OrderOpenPrice()-OrderStopLoss() > 0)) if (OrderStopLoss() != (OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_POINT))) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_POINT)*BEOffset, OrderTakeProfit(), Red); } } } void TrailIt( int byPips ) // based on trailing stop code from MT site... thanks MT! { if (byPips >=5) { for (int i = 0; i < OrdersTotal(); i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == Magic)) ) { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > byPips * MarketInfo(OrderSymbol(), MODE_POINT)) { if (OrderStopLoss() < Bid - byPips * MarketInfo(OrderSymbol(), MODE_POINT)) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - byPips * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), Red); } } } else if (OrderType() == OP_SELL) { if (OrderOpenPrice() - Ask > byPips * MarketInfo(OrderSymbol(), MODE_POINT)) { if ((OrderStopLoss() > Ask + byPips * MarketInfo(OrderSymbol(), MODE_POINT)) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + byPips * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), Red); } } } } } } } // proc TrailIt() double LotSize() { double Account = 0; double lotMM = MathCeil(AccountFreeMargin() * Risk / 1000) / 1000; if(AccountIsMicro) { if(lotMM < 0.01) lotMM = 0.01; if(lotMM >= MaxLotSize) lotMM = MaxLotSize; AccountSize=2; } else { if(lotMM < 0.1) lotMM = 0.1; if(lotMM >= MaxLotSize) lotMM = MaxLotSize; AccountSize=1; } lotMM = NormalizeDouble(lotMM,AccountSize); return (lotMM); } // Closing of Open Orders void OpenOrdClose() { int total=OrdersTotal(); for (int cnt=0;cnt